package be.rugbyclubleuven.rachel.dao;

import java.util.Calendar;
import java.util.Date;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.FetchMode;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Repository;

import be.rugbyclubleuven.rachel.domain.Wedstrijd;

/**
 * A service that offers the retrieval and persisting of all wedstrijd data.
 * 
 */
@Repository("wedstrijdDAO")
public class WedstrijdDAO extends GenericHibernateDAO<Wedstrijd, Long> {

	protected static final Logger LOGGER = LoggerFactory.getLogger(WedstrijdDAO.class);

	/**
	 * Constructs a new wedstrijd DAO with the right session factory injected.
	 * @param sessionFactory The session factory implementation to be used in this DAO.
	 */
	@Autowired
	public WedstrijdDAO(@Qualifier("rachelSessionFactory") SessionFactory sessionFactory) {
		this.sessionFactory = sessionFactory;
	}

	public Wedstrijd getWedstrijdWithSpelers(Long wedId) {
		Criteria criteria = getSession().createCriteria(Wedstrijd.class);
		criteria.add(Restrictions.idEq(wedId));
		criteria.setFetchMode("spelers", FetchMode.JOIN);
		criteria.setFetchMode("nietSpelers", FetchMode.JOIN);
		return (Wedstrijd) criteria.uniqueResult();
	}

	public List<Wedstrijd> getFutureWedstrijdByPloegId(Long ploegId, Integer start, Integer limit) {
		Criteria criteria = getSession().createCriteria(Wedstrijd.class);
		criteria.add(Restrictions.eq("ploeg.id", ploegId));
		Calendar today = Calendar.getInstance();
		today.add(Calendar.DATE, -1);
		Date yesterday = new Date(today.getTimeInMillis());
		criteria.add(Restrictions.gt("datum", yesterday));
		criteria.setFirstResult(start);
		criteria.setMaxResults(limit);
		criteria.addOrder(Order.asc("datum"));
		return criteria.list();
	}
}